package com.qf.mp2301.utils;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 自定义 分布式锁，基于 Redis的 setnx命令
 */
@Component
public class RedisLock {

    @Autowired
    RedisTemplate redisTemplate;

    /**
     * 加锁方法
     */
    public void lock(String key){

        //1. 调用 setnx命令
        Boolean flag = redisTemplate.opsForValue().setIfAbsent(key, new Date());

        if (flag){
            // 申请分布式锁成功，直接返回即可
            return;
        }else {
            while (true){
                // 让申请锁失败的线程进入一个自旋结构，尝试再次申请分布式锁，直到成功位置
                Boolean f = redisTemplate.opsForValue().setIfAbsent(key, new Date());
                if (f){
                    return;
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }

    }

    /**
     * 解锁
     */
    public void unlock(String key){
        // 释放锁就是把 key 删除
        redisTemplate.delete(key);
    }


}
